Spring整合Mybatis原理 |
您所在的位置:网站首页 › spring 整合mybatis › Spring整合Mybatis原理 |
Spring整合Mybatis原理
目录Spring整合Mybatis原理1、@MapperScan注解发挥作用1.1、导入MapperScannerRegistrar类1.1.2、执行ImportBeanDefinitionRegistrar接口中的registerBeanDefinitions方法1.2、ClassPathMapperScanner1.2.1、对筛选出来的BeanDefinition进行处理1.3、SqlSessionFactoryBean类结构体系1.3.1、SqlSessionFactoryBean使用1.4、SqlSessionTemplate1.4.1、构造方法1.4.2、增删改查方法1.4.3、SqlSessionInterceptorSpring整合Mybatis后为什么一级缓存失效sqlsession的提交和回滚在哪里流程三、总结Mybatis-Spring 新版本底层源码执行流程
1、@MapperScan注解发挥作用
在Spring整合Mybatis的时候,只需要一个@MapperScan注解就可以来进行操作,所以更加好奇的是@MapperScan底层是怎么来做到的。 下面先来研究一下@MapperScan: @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(MapperScannerRegistrar.class) @Repeatable(MapperScans.class) public @interface MapperScan { ... }@Import注解导入了一个MapperScannerRegistrar。而在Spring启动的时候,会在org.Springframework.context.support.AbstractApplicationContext#refresh方法中会来执行@Import导入的类,看下如何来解析@Import注解的。直接来到org.Springframework.context.annotation.ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForConfigurationClass会来解析@Import注解导入进来的类,那么下面就需要来看一下MapperScannerRegistrar做了什么事情。 1.1、导入MapperScannerRegistrar类下面来看一下MapperScannerRegistrar的结构体系 1.1.2、执行ImportBeanDefinitionRegistrar接口中的registerBeanDefinitions方法MapperScannerRegistrar类实现了ImportBeanDefinitionRegistrar接口,而实现了接口中的方法,那么在注册BeanDefinition之前,就会来执行ImportBeanDefinitionRegistrar接口中的方法 default void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { }那么只需要看一下MapperScannerRegistrar中的registerBeanDefinitions方法是如何来进行实现的: 1.2、MapperScannerConfigurer 而在上面的代码中,主要是注册了一个MapperScannerConfigurer类型的BeanDefinition。 那么来看一下这个BeanDefinition有什么特点: MapperScannerRegistrar实现了BeanDefinitionRegistryPostProcessor接口。而这个接口中又会在ConfigurationClassPostProcessor之后发挥作用,而MapperScannerRegistrar对应的BeanDefinition是在此之前来进行解析的,所以将会在下面来解析MapperScannerRegistrar对应的BeanDefinition 那么就会来执行MapperScannerConfigurer中的postProcessBeanDefinitionRegistry方法 1.2、ClassPathMapperScanner那么看一下Spring-Mybatis中自定义整合的ClassPathMapperScanner中的注册过滤器和扫描逻辑: 将扫描出来的类利用包含过滤器添加到当前逻辑中。 那么来看一下扫描逻辑: 然后可以看到只要接口的类 1.2.1、对筛选出来的BeanDefinition进行处理然后对扫描出来的接口来进行筛选判断: org.mybatis.Spring.mapper.ClassPathMapperScanner#processBeanDefinitions 1、首先获取得到接口的全限定类型。如:com.guang.dao.UserDao; 2、将当前的BeanClass设置成MapperFactoryBean,而这个类是FactoryBean类型的。在创建对象的时候,说明是要用getObject方法来创建对象的; 3、设置MapperFactoryBean构造函数中的值。在MapperFactoryBean构造函数中是Class类型,而这里设置的是String,在创建的时候Spring回来进行转换; 4、将MapperFactoryBean的注入模型设置为By-Type。也就是说,MapperFactoryBean中的setXxx中的属性会从容器中来进行查找; 那么看一下MapperFactoryBean的构造方法: public MapperFactoryBean(Class mapperInterface) { this.mapperInterface = mapperInterface; }这里会将mapperInterface在进行赋值的时候将java.lang.String转换成Class类型,表示对应的接口。 第二个: 说明了在MapperFactoryBean中的setXxxx方法对应的xxx属性,Spring会自动来进行赋值。而MapperFactoryBean继承了SqlSessionDaoSupport,在SqlSessionDaoSupport类中的set方法中存在setSqlSessionFactory方法和setSqlSessionTemplate方法,所以容器中如果存在着对应类型的对象的时候,那么Spring到时候来进行赋值的时候将会从容器中来进行获取得到对应的bean。 所以:SqlSessionTemplate我们可以自己配置,但是SqlSessionFactory就得由我们自己来进行配置了。 1.3、SqlSessionFactoryBean类结构体系SqlSessionFactoryBean类就是来帮我们创建SqlSessionFactory,看下SqlSessionFactory的结构如下所示: SqlSessionFactoryBean也是一个FactoryBean类型的,产生的对象的类型是:SqlSessionFactory。 看一下对应的getObjectType方法: public Class |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |